#ifndef HYPOTHESIS_H__
#define HYPOTHESIS_H__

#include "common/measure.h"
#include "common/target.h"

using namespace common;

namespace mht
{
	/**
	 * \brief Класс "Гипотеза"
	 * 
	 * Класс содержит параметры и методы, связанные с "гипотезой":
	 * событием, с которым связаны:
	 * - некоторые существующие траектории вместе с их параметрами;
	 * - вероятность (априорная либо апостериорная)
	 */
	class Hypothesis
	{
	public:
		explicit Hypothesis();
		explicit Hypothesis(const Targets&);
		virtual ~Hypothesis();

		/// get-метод для вероятности гипотезы
		double getProbability() const {return m_probability;}
		
		/// Осуществить ассоциацию гипотезы с набором измерений
		void associate(
			Measures::const_iterator a_begin, ///< Начало контейнера
			Measures::const_iterator a_end    ///< Конец контейнера
			);  

		/// Сгенерировать новые гипотезы после ассоциации
		std::vector<Hypothesis*> generate() const;

	private:
		Hypothesis(const Hypothesis&);
		Hypothesis& operator=(const Hypothesis&);

		/// Текущая вероятность гипотезы
		double m_probability;

		/// Истинные траектории (согласно гипотезе)
		Targets m_targets;
	};
};

#endif // HYPOTHESIS_H__
